package designPattern.creation5.Prototype.Sample;

import designPattern.creation5.Prototype.Sample.framework.Manager;
import designPattern.creation5.Prototype.Sample.framework.Product;

public class Main {
    public static void main(String[] args) {
        //生产者Manager 生产Product打印机，
        // 打印机有两种类型：
        // 1)下划线类型----UnderlinePen
        // 2)全包围类型----MessageBox


        // 准备
        Manager manager = new Manager();

        Product upen = new UnderlinePen('~');
        Product mbox = new MessageBox('*');
        Product sbox = new MessageBox('/');


        manager.register("strong message", upen);
        manager.register("warning box", mbox);
        manager.register("slash box", sbox);

        /**********  manager通过复制的方式生产产品    **********/
        Product p1 = manager.create("strong message");//manager通过复制 upen 生产了p1
        Product p2 = manager.create("warning box");//manager通过复制 mbox 生产了p2
        Product p3 = manager.create("slash box");//manager通过复制 sbox 生产了p3



        /**********  新产品与原产品的使用结果一致   **********/

        System.out.println("-----使用新产品-----");
        p1.use("Hello, world.");
        p2.use("Hello, world.");
        p3.use("Hello, world.");
        System.out.println();
        System.out.println();


        System.out.println("-----使用原产品-----");
        upen.use("Hello, world.");
        mbox.use("Hello, world.");
        sbox.use("Hello, world.");
        System.out.println();
        System.out.println();



        /**********  通过hash，可以看到新产品与原产品是不一样的   **********/
        System.out.println("-----hash-----");
        System.out.println("p1:"+p1.hashCode()+" | upen:"+upen.hashCode());
        System.out.println("p2:"+p2.hashCode()+" | mbox:"+mbox.hashCode());
        System.out.println("p3:"+p3.hashCode()+" | sbox:"+sbox.hashCode());

    }


}
